#include "comm.hpp"

// shmget、shmat、shmdt
int main()
{
    // 1.使用ftok函数（算法）创建公共的key值，是多少不重要
    key_t k = ftok(PATH_NAME, PROJ_ID);
    assert(k != -1);
    Log("create key done", Debug) << "server key:" << k << endl;

    // 2.shmget函数创建共享内存
    int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666);
    if (shmid == -1)
    {
        perror("shmget");
        exit(1);
    }
    Log("create shm done", Debug) << "shmid:" << shmid << endl;
    sleep(10);

    // 3.使用shmat函数将指定的共享内存关联到自己的地址空间（和自己的进程关联）
    char *shmaddr = (char *)shmat(shmid, nullptr, 0); // 返回的是在该进程地址空间中，指向该共享内存的起始地址
    Log("attach shm done", Debug) << "shmid:" << shmid << endl;
    sleep(10);

    // 通信逻辑

    // 4.使用shmdt函数，在页表内去除该共享内存和本进程的关联
    int n = shmdt(shmaddr);
    assert(n != -1);
    (void)n;
    Log("detach shm done", Debug) << "shmid:" << shmid << endl;
    sleep(10);

    // 最后一步，删除共享内存
    n = shmctl(shmid, IPC_RMID, nullptr);
    assert(n != -1);
    (void)n;
    Log("delete shm done", Debug) << "shmid:" << shmid << endl;
    return 0;
}
